package SIC.Controleur.Mapping;

import java.io.File;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

/**
 * Cette classe permet de stocker les correspondances entre CAO et FAO,
 * et de les enregistrer/charger au format xml.
 */
@XmlRootElement(name="correspondancesCAOFAO")
public class CorrespondancesCaoFao {

	//--------------------------------------------
	//					ATTRIBUTS
	//--------------------------------------------
	
	/**
	 * Key : le nom du produit CAO
	 * Value : les noms des produits FAO 
	 */
	@XmlJavaTypeAdapter(SIC.Controleur.XMLAdapter.HashMapAdapter.class)
	public HashMap<String, List<String>> correspondancesCAO = new HashMap<String, List<String>>();
	
	/**
	 * Key : le nom du produit FAO
	 * Value : les noms des produits CAO 
	 */
	@XmlJavaTypeAdapter(SIC.Controleur.XMLAdapter.HashMapAdapter.class)
	public HashMap<String, List<String>> correspondancesFAO = new HashMap<String, List<String>>();

	//NON PERSISTANT ----------------------
	
	@XmlTransient
	private File fichier;
	@XmlTransient
	private Marshaller marshaller;
	@XmlTransient
	private Unmarshaller unmarshaller;
	
	//--------------------------------------------
	//				CONSTRUCTEUR
	//--------------------------------------------
	
	public CorrespondancesCaoFao() {}
	
	/**
	 * @param fichierCorresp emplacement du fichier de correspondance
	 */
	public CorrespondancesCaoFao(String fichierCorresp) {
		
		fichier = new File(fichierCorresp);
		
		try {
			
			JAXBContext jaxbContext = JAXBContext.newInstance(CorrespondancesCaoFao.class);
			
			marshaller = jaxbContext.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

			unmarshaller = jaxbContext.createUnmarshaller();
			
		} catch (JAXBException e) {
			e.printStackTrace();
		}
	}
	
	//--------------------------------------------
	//			   	PERSISTANCE
	//--------------------------------------------
	
	/**
	 * Cette méthode est à lancer une fois afin de créer le fichier de correspondances
	 */
	public void creerFichierCorrespondance()
	{
		correspondancesCAO.put("Stylo",Arrays.asList("Stylo"));
		correspondancesCAO.put("Capuchon",Arrays.asList("Capuchon"));
		correspondancesCAO.put("Corps",Arrays.asList("Bouchon","Tube-cylindrique","Cartouche"));
		correspondancesCAO.put("Tube",Arrays.asList("Tube-cylindrique"));
		correspondancesCAO.put("Recharge",Arrays.asList("Cartouche"));
		correspondancesCAO.put("Bouchon",Arrays.asList("Bouchon"));
		correspondancesCAO.put("Tete-d-ecriture",Arrays.asList("Objet-conique","Bille"));
		correspondancesCAO.put("Reservoir",Arrays.asList("Mine"));
		correspondancesCAO.put("Bille",Arrays.asList("Bille"));
		
		correspondancesFAO.put("Objet-conique",Arrays.asList("Support-de-tete","Tete"));
	
		save();
	}
	
	/**
	 * Sauvegarde les correspondances FAO et CAO dans un fichier xml
	 */
	public void save()
	{
		try
		{
			marshaller.marshal(this, fichier);
		} catch (JAXBException e) {
			System.err.println("Erreur de marshalling des correspondances.");
			e.printStackTrace();
		}
	}
	
	/**
	 * Charge les données xml dans la classe
	 */
	public void load()
	{
		try 
		{
			CorrespondancesCaoFao cor = (CorrespondancesCaoFao) unmarshaller.unmarshal(fichier);
			correspondancesCAO = cor.correspondancesCAO;
			correspondancesFAO = cor.correspondancesFAO;
			
		} catch (JAXBException e) {
			System.err.println("Erreur d'unmarshalling des correspondances.");
			e.printStackTrace();
		}
	}
	
	//--------------------------------------------
	//			   	TO STRING
	//--------------------------------------------

	@Override
	public String toString(){
		
		String resultat = "Correspondances CAO : \n";
		
		for(Entry<String, List<String>> entry : correspondancesCAO.entrySet())
		{
			String produit = entry.getKey();
			List<String> valeurs = entry.getValue();
			
			resultat += "CAO:" + produit + " = ";
			
			for(int i = 0; i < valeurs.size(); i++)
			{
				resultat += "FAO:" +  valeurs.get(i);
				
				if(i != valeurs.size() - 1)
					resultat += " + ";
			}
			
			resultat += "\n";
			
		}
		
		resultat += "\n\nCorrespondances FAO : \n";
		
		for(Entry<String, List<String>> entry : correspondancesFAO.entrySet())
		{
			String produit = entry.getKey();
			List<String> valeurs = entry.getValue();
			
			resultat += "FAO:" + produit + " = ";
			
			for(int i = 0; i < valeurs.size(); i++)
			{
				resultat += "CAO:" +  valeurs.get(i);
				
				if(i != valeurs.size() - 1)
					resultat += " + ";
			}
			
			resultat += "\n";
			
		}
		
		return resultat;
		
	}
	
	//--------------------------------------------
	//			   	GETTER/SETTER
	//--------------------------------------------
	
	public HashMap<String, List<String>> getCorrespondancesCAO() {
		return correspondancesCAO;
	}
	
	public HashMap<String, List<String>> getCorrespondancesFAO() {
		return correspondancesFAO;
	}
	
}
